package com.gengzp.permission.core;

import com.gengzp.permission.exception.PermissionException;
import com.gengzp.permission.model.UserPrincipalModel;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * @ClassName PermissionCoreFunc
 * @Description 权限认证框架核心方法接口
 * @Author gengzp
 * @Date 2025/8/14 22:01
 */
public interface PermissionCoreFunc {

    /**
     * 获取缓存中的用户认证信息
     *
     * @param token 用户token
     * @return 用户认证信息
     */
    UserPrincipalModel getCacheUserPrincipalModel(String token);

    /**
     * 根据角色id集合获取所有拥有的权限编码
     *
     * @param roleIds 角色id集合
     * @return 当前角色拥有的权限编码集合
     */
    Set<String> getAllPermissionCodesByRoleIds(Collection<String> roleIds);

    /**
     * 获取超级管理员的用户id
     *
     * @return 超级管理员的用户id
     */
    String getSuperAdminUserId();

    /**
     * 获取超级管理员的用户账号
     *
     * @return 获取超级管理员的用户账号
     */
    String getSuperAdminUserAccount();

    /**
     * 获取超级管理员的用户昵称
     *
     * @return 获取超级管理员的用户昵称
     */
    String getSuperAdminNickname();

    /**
     * 获取超级管理员的用户密码
     *
     * @return 获取超级管理员的用户密码
     */
    String getSuperAdminUserPassword();

    /**
     * 获取超级管理员用户加密盐值
     *
     * @return 获取超级管理员用户加密盐值
     */
    String getSuperAdminUserSalt();

    /**
     * 保存用户认证信息线程变量
     *
     * @param userPrincipalModel 用户认证信息
     */
    void saveUserPrincipalModelThreadLocal(UserPrincipalModel userPrincipalModel);

    /**
     * 保存用户认证信息到缓存
     *
     * @param userPrincipalModel 用户认证信息
     */
    void saveUserPrincipalModelToCache(UserPrincipalModel userPrincipalModel);

    /**
     * 清除用户认证信息线程变量
     */
    void clearUserPrincipalModelThreadLocal();

    /**
     * 用户登录
     *
     * @param userId     用户id
     * @param clientType 登录客户端类型
     * @param roleIds    用户角色id集合
     * @return token
     */
    UserPrincipalModel login(String userId, String clientType, Collection<String> roleIds) throws PermissionException;

    /**
     * 用户退出
     *
     * @param userId 用户id
     * @param token  当前在线的用户token
     */
    void quit(String userId, String token);

    void kickOut(String userId);

    /**
     * 从前程变量中获取当前用户认证信息
     *
     * @return 当前用户认证信息
     */
    UserPrincipalModel getCurrentUserPrincipalModelFromThreadLocal();

    /**
     * 获取当前请求中的用户拥有的所有权限编码集合
     *
     * @return 当前请求中的用户拥有权限编码集合
     */
    Set<String> getCurrentUserOwnedPermissionCodes() throws PermissionException;

    /**
     * 为角色分配权限, 保存在缓存中
     *
     * @param roleId          角色id
     * @param permissionCodes 权限编码集合
     * @param isReplace       是否替换标识, 0:新增; 1: 替换掉当前角色已有权限
     */
    void assignCacheRolePermissions(String roleId,
                                    Collection<String> permissionCodes,
                                    boolean isReplace) throws PermissionException;

    /**
     * 为用户分配角色, 保存在缓存中
     *
     * @param userId    用户id
     * @param roleIds   角色id集合
     * @param isReplace 是否替换标识, 0:新增; 1: 替换掉当前用户已绑角色
     */
    void assignCacheUserRoles(String userId,
                              Collection<String> roleIds,
                              boolean isReplace) throws PermissionException;

    /**
     * 移除缓存中的指定id的角色数据
     *
     * @param roleId 角色id
     */
    void removeCacheRole(String roleId) throws PermissionException;

    /**
     * 移除缓存中所有角色数据
     */
    void removeAllCacheRoles() throws PermissionException;

    /**
     * 根据角色id获取角色拥有的权限编码集合
     *
     * @param roleId 角色id
     * @return 角色拥有的权限编码集合
     */
    Set<String> getRolePermissionCodes(String roleId) throws PermissionException;

    /**
     * 根据角色id集合获取所有拥有的权限编码集合
     *
     * @param roleIds 角色id集合
     * @return 所有拥有的权限编码集合
     */
    Set<String> getRolePermissionCodes(Collection<String> roleIds) throws PermissionException;

    /**
     * 获取所有缓存中的角色id
     *
     * @return 角色id集合
     */
    List<String> getAllCacheRoleIds();

}
